home *** CD-ROM | disk | FTP | other *** search
/ Software Vault: The Gold Collection / Software Vault - The Gold Collection (American Databankers) (1993).ISO / cdr12 / toplib50.zip / STARC2.ZIP / STAR.ASM < prev    next >
Assembly Source File  |  1993-01-20  |  11KB  |  300 lines

  1. ;compile this .asm file as normal
  2. ;use the link option /cp:70 which will allocate this program
  3. ;70 paragraphs of memory
  4. ;exe format
  5. DOSSEG
  6.  
  7. .MODEL  SMALL
  8.  
  9. .STACK  100h
  10.  
  11. .DATA
  12.  
  13. INT_NUMBER      EQU     08h             ;INTERRUPT NUMBER TO HOOK INTO
  14. INT_NUMBER_2    EQU     21h
  15. LOAD_PARAMETERS DW      00h
  16.                 DW      0080h           ;COMMAND LINE IN PSP - OFFSET
  17.                 DW      @CURSEG         ;       SEGMENT
  18.                 DW      005Ch           ;FIRST FCB IN PSP    - OFFSET
  19.                 DW      @CURSEG         ;       SEGMENT
  20.                 DW      006Ch           ;SECOND FCB IN PSP   - OFFSET
  21.                 DW      @CURSEG         ;       SEGMENT
  22.  
  23. OLD_VECTOR      DD      0h              ;STORAGE FOR OLD INTERRUPT
  24.                                         ;VECTOR
  25. OLD_VECTOR_2    DD      0h
  26. ORIG_VECTOR     DD      0h              ;ORIGINAL VECTOR FOR INT_NUMBER
  27. MEM_SIZE        EQU     200h            ;FUTURE USE FOR INT 21 SERV.4A
  28. PROGRAM_NAME    DB      "STARCON2.EXE",0
  29. CODESTART       EQU     03F4h
  30. ALREADY         DB      00h
  31. DIFFERENCE      EQU     2962h           ;52F7-2995
  32. OFFSET_1        EQU     7B3Eh           ;FIRST OFFSET TO MAKE CHANGES
  33. ORIGINAL_DS     DW      0h
  34.  
  35. HEADER          DB      "         **TOP**",0Dh,0Ah,0Ah
  36.                 DB      "   TIRED OF PROTECTION",0Dh,0Ah,0Ah
  37.                 DB      "CRACKED BY THE MAD DOCTOR",0Dh,0Ah,"$"
  38. FAILED_LOAD     DB      0Ah,0Ah,"FAILED TO LOAD PROGRAM",0Dh,0Ah,"$"
  39. NOT_FOUND       DB      "FILE NOT FOUND",0Dh,0Ah,"$"
  40. INSUF_MEMORY    DB      "INSUFFICIENT MEMORY",0Dh,0Ah,"$"
  41.  
  42. STARCODE        DB      "VEGA",0h,"ANTLIAE",0h,"APODIS",0h,"AQUARII",0h
  43.                 DB      "AQUILAE",0h,"ARAE",0h,"ARIETIS",0h,"AURIGAE",0h
  44.                 DB      "TRIANGULI",0h,"CAELI",0h,"CAMELOPARDALIS",0h
  45.                 DB      "CANCRI",0h,"BRAHE",0h,"KEPLER",0h,"COPERNICUS"
  46.                 DB      0h,"CAPRICORNI",0h,"CARINAE",0h,"CASSIOPEIAE",0h
  47.                 DB      "TUCANAE",0h,"CEPHEI",0h,"CETI",0h,"CRATERIS",0h
  48.                 DB      "CIRCINI",0h,"COLUMBAE",0h,"CHANDRASEKHAR",0h
  49.                 DB      "SAGITTAE",0h,"CYGNUS",0h,"CORVI",0h
  50.                 DB      "CHAMAELEONIS",0h,"EQUULEI",0h,"DELPHINI",0h
  51.                 DB      "DORADUS",0h,"MONOCEROTIS",0h,"CRUCIS",0h
  52.                 DB      "ERIDANI",0h,"FORNACIS",0h,"GEMINORUM",0h
  53.                 DB      "ALTAIR",0h,"ANTARES",0h,"HOROLOGII",0h,"HYDRAE"
  54.                 DB      0h,"ANDROMEDAE",0h,"GROOMBRIDGE",0h,"LACERTAE"
  55.                 DB      0h,"LEONIS",0h,"HYADES",0h,"LEPORIS",0h,"LIBRAE"
  56.                 DB      0h,"LIPI",0h,"LYNCIS",0h,"FOMALHAUT",0h
  57.                 DB      "MENKAR",0h,"MICROSCOPII",0h,"DRACONIS",0h
  58.                 DB      "ORIONIS",0h,"NORMAE",0h,"OCTANTIS",0h
  59.                 DB      "OPHIUCHI",0h,"MUSCAE",0h,"PAVONIS",0h,"PEGASI"
  60.                 DB      0h,"PERSEI",0h,"PHOENICIS",0h,"PICTORIS",0h
  61.                 DB      "PISCIUM",0h,"HYGINUS",0h,"PUPPIS",0h,"PYXIDIS"
  62.                 DB      0h,"RETICULI",0h,"ARIANNI",0h,"SAGITTARII",0h
  63.                 DB      "SCORPII",0h,"SCULPTORIS",0h,"SCUTI",0h
  64.                 DB      "SERPENTIS",0h,"SEXTANTIS",0h,"TAURI",0h
  65.                 DB      "TELESCOPII",0h,"BOOTIS",0h,"OLBER",0h
  66.                 DB      "CENTAURI",0h,"PTOLEMAE",0h,"GORNO",0h
  67.                 DB      "VELORUM",0h,"VIRGINIS",0h,"VOLANTIS",0h
  68.                 DB      "VULPECULAE",0h,"LALANDE",0h,"LUYTEN",0h,"INDI"
  69.                 DB      0h,"LACAILLE",0h,"GICLAS",0h,"KRUEGER",0h
  70.                 DB      "LYRAE",0h,"WOLF",0h,"SAURUS",0h,"RAYNET",0h
  71.                 DB      "ZEEMAN",0h,"VELA",0h,"MIRA",0h,"CERENKOV",0h
  72.                 DB      "MERSENNE",0h,"MAKSUTOV",0h,"KLYSTRON",0h
  73.                 DB      "METIS",0h,"MENSAE",0h,"ILLUMINATI",0h
  74.                 DB      "VITALIS",0h,"HERCULIS",0h,"GRUIS",0h,"SQUIDI"
  75.                 DB      0h,"ALMAGEST",0h,"ALCOR",0h,"ALGOL",0h
  76.                 DB      "BETELGEUSE",0h,"ALDEBARAN",0h,"ACHERNAR",0h
  77.                 DB      "PROCYON",0h,"RIGEL",0h,"BELLATRIX",0h
  78.                 DB      "MIZAR",0h,"HYPERION",0h,"REGULUS",0h
  79.                 DB      "ORGANON",0h,"POLLUX",0h,"CAPELLA",0h,"DENEB"
  80.                 DB      0h,"CANOPUS",0h,"SIRIUS",0h,"SOL",0h
  81.                 DB      "ARCTURUS",0h,"LENTILIS",0h
  82.  
  83.  
  84.  
  85. .CODE
  86.  
  87. LOADER          PROC
  88.  
  89.         JMP     START
  90.  
  91. INTERRUPT_ENTRY_2       PROC    FAR
  92.         PUSHF
  93.         PUSH    AX
  94.         PUSH    BP
  95.         CMP     AX,3524h
  96.         JNZ     QUIT_2
  97.         MOV     AX,SP
  98.         MOV     BP,AX
  99.         CMP     [BP+6],0199h
  100.         JNZ     QUIT_2
  101.         PUSH    SP
  102.         PUSH    DS
  103.         PUSH    ES
  104.         PUSH    BX
  105.         PUSH    DX
  106.         MOV     AL,INT_NUMBER
  107.         MOV     AH,35h
  108.         INT     21h                     ;GET INT VECTOR FOR INT21
  109.                                         ;AND PUT INTO ES:BX
  110.         MOV     AX,DGROUP
  111.         MOV     DS,AX
  112.         MOV     WORD PTR OLD_VECTOR[0],BX     ;SAVE OLD INT VECTORS
  113.         MOV     WORD PTR OLD_VECTOR[2],ES
  114.         MOV     DX,OFFSET INTERRUPT_ENTRY
  115.         MOV     AX,CS
  116.         MOV     DS,AX
  117.         MOV     AL,INT_NUMBER
  118.         MOV     AH,25h
  119.         INT     21h                     ;PUT NEW INT VECTOR IN FOR
  120.                                         ;INTERRUPT_ENTRY
  121.         POP     DX
  122.         POP     BX
  123.         POP     ES                      ;
  124.         POP     DS                      ;
  125.         POP     SP
  126.  
  127. QUIT_2:
  128.  
  129.         POP     BP
  130.         POP     AX
  131.         POPF
  132.         JMP     DWORD PTR CS:OLD_VECTOR_2
  133.  
  134. INTERRUPT_ENTRY_2       ENDP
  135.  
  136.  
  137. INTERRUPT_ENTRY         PROC    FAR
  138.         PUSHF                           ;SAVE NEEDED REGISTERS
  139.         PUSH    AX
  140.         PUSH    DS
  141.         PUSH    ES
  142.         MOV     AX,DS
  143.         MOV     ES,AX
  144.         MOV     AX,DGROUP
  145.         MOV     DS,AX
  146.         CMP     [ALREADY],01h
  147.         JZ      QUIKQUIT
  148.         CMP     BYTE PTR ES:[OFFSET_1+0],"T"
  149.         JNZ     QUIKQUIT
  150.         CMP     BYTE PTR ES:[OFFSET_1+1],"O"
  151.         JNZ     QUIKQUIT
  152.         CMP     BYTE PTR ES:[OFFSET_1+2],"P"
  153.         JNZ     QUIKQUIT
  154.  
  155.  
  156.                                         ;**THIS IS WHERE THE FUN BEGINS**
  157.         PUSH    BX                      ;SAVE MORE REGISTERS
  158.         PUSH    CX
  159.         PUSH    DX
  160.         PUSH    SI
  161.         PUSH    DI
  162.         PUSH    BP
  163.         PUSH    SP
  164.         MOV     CX,ES                   ;STORE ES IN CX FOR LATER
  165.         MOV     AX,ES
  166.         ADD     AX,DIFFERENCE           ;AX=527F  (THE PROGRAM CS)
  167.         MOV     ES,AX                   ;ES=AX
  168.      
  169.         MOV     DI,CODESTART            ;03F4h -PARENT PROGRAM CS:03F4
  170.         MOV     BX,OFFSET STARCODE      ;MY CODE LOCATION
  171.  
  172. SCAN:
  173.  
  174.         MOV     AL,BYTE PTR ES:[DI]        ;ENEMY INFO
  175.         CMP     AL,61h                  ;IS THE LETTER SMALL (>=61) OR
  176.         JB      CONTINUE                ;CAPITAL
  177.         SUB     AL,20h                  ;SMALL--TURN IT INTO A CAPITAL
  178.  
  179. CONTINUE:
  180.         
  181.         CMP     BYTE PTR [BX],AL     ;DS:BX (MY CODE) TO THEIRS IN AL
  182.         JNZ     FOUND
  183.         INC     DI
  184.         INC     BX
  185.         JMP     SCAN
  186.  
  187. FOUND:
  188.  
  189.         MOV     [ALREADY],01h      ;SO WE DON'T REPEAT THIS
  190.         MOV     ES,CX
  191.         MOV     DI,OFFSET_1        ;
  192.         XOR     AX,AX
  193.         
  194. REPEAT:
  195.  
  196.         MOV     AL,BYTE PTR [BX]
  197.         MOV     BYTE PTR ES:[DI],AL
  198.         INC     BX
  199.         INC     DI
  200.         OR      AX,AX
  201.         JNZ     REPEAT
  202.  
  203. DONE:
  204.  
  205.         POP     SP
  206.         POP     BP
  207.         POP     DI
  208.         POP     SI
  209.         POP     DX
  210.         POP     CX
  211.         POP     BX
  212.  
  213. QUIKQUIT:
  214.  
  215.         POP     ES
  216.         POP     DS
  217.         POP     AX
  218.         POPF
  219.  
  220.         JMP     DWORD PTR CS:OLD_VECTOR ;JMP TO THE REST OF THE
  221.                                         ;INTERRUPT
  222.  
  223. INTERRUPT_ENTRY         ENDP
  224.  
  225. START           PROC
  226.  
  227.         MOV     BX,DGROUP               ;INITIALIZE DS TO THE DATA
  228.         MOV     DS,BX                   ;SEGMENT
  229.         MOV     DX,OFFSET HEADER
  230.         MOV     AH,9
  231.         INT     21h                     ;PRINT A TITLE
  232.         PUSH    DS
  233.         PUSH    DS
  234.         MOV     AL,INT_NUMBER_2
  235.         MOV     AH,35h
  236.         INT     21h                     ;GET INT VECTOR FOR INT21
  237.                                         ;AND PUT INTO ES:BX
  238.         MOV     WORD PTR OLD_VECTOR_2[0],BX     ;SAVE OLD INT VECTORS
  239.         MOV     WORD PTR OLD_VECTOR_2[2],ES
  240.         MOV     AL,INT_NUMBER
  241.         MOV     AH,35h                  ;SAVE THE ORIGINAL INT 8 VECTOR
  242.         INT     21h
  243.         MOV     WORD PTR ORIG_VECTOR[0],BX
  244.         MOV     WORD PTR ORIG_VECTOR[2],ES
  245.         MOV     DX,OFFSET INTERRUPT_ENTRY_2
  246.         MOV     AX,CS
  247.         MOV     DS,AX
  248.         MOV     AL,INT_NUMBER_2
  249.         MOV     AH,25h
  250.         INT     21h                     ;PUT NEW INT VECTOR IN FOR
  251.                                         ;INTERRUPT_ENTRY
  252.         POP     DS                      ;RE-INITIALIZE DS AND ES TO
  253.         POP     ES                      ;THE DATA SEGMENT
  254.         MOV     DX,OFFSET PROGRAM_NAME
  255.         MOV     BX,OFFSET LOAD_PARAMETERS
  256.         MOV     AX,4B00h                ;LOAD PROGRAM, NAME AT DS:DX,
  257.         INT     21h                     ;PARAMETERS AT ES:BX
  258.         JNC     RESTORE                 ;JMP IF LOAD WAS SUCCESSFUL
  259.         PUSH    AX
  260.         MOV     AH,9                    ;PRINT THAT LOAD FAILED
  261.         MOV     DX,OFFSET FAILED_LOAD
  262.         INT     21h
  263.         POP     AX
  264.         CMP     AX,8                    ;IF AX=8 THEN THERE WAS
  265.         JE      NO_MEMORY               ;INSUFFICIENT MEMORY
  266.         CMP     AX,2
  267.         JNE     RESTORE                 ;IF NOT 2 OR 8 THEN ?--
  268.                                         ;JUST RESTORE AND EXIT
  269.         MOV     DX,OFFSET NOT_FOUND     ;IF AX=2 THEN THE FILE WAS NOT
  270.         JMP     PRINT_ERROR             ;FOUND
  271.  
  272. NO_MEMORY:
  273.  
  274.         MOV     DX,OFFSET INSUF_MEMORY
  275.  
  276. PRINT_ERROR:
  277.  
  278.         MOV     AH,9
  279.         INT     21h
  280.  
  281. RESTORE:
  282.  
  283.         LDS     DX,DWORD PTR OLD_VECTOR_2
  284.         MOV     AL,INT_NUMBER_2         ;RESTORE OLD INTERRUPT VECTOR
  285.         MOV     AH,25h
  286.         INT     21h
  287.         MOV     AX,DGROUP
  288.         MOV     DS,AX
  289.         LDS     DX,DWORD PTR ORIG_VECTOR
  290.         MOV     AL,INT_NUMBER
  291.         MOV     AH,25h
  292.         INT     21h
  293.         MOV     AX,4C00h                ;EXIT TO DOS
  294.         INT     21h
  295.  
  296. START           ENDP
  297. LOADER          ENDP
  298.         END     LOADER
  299.  
  300.